// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

import "runtime/internal/sys"

const MaxUintptr = ^uintptr(0)

// muluintpttr返回a*b以及乘法是否溢出。
// 在支持的平台上，这是一个由编译器降低的固有值。
func MulUintptr(a, b uintptr) (uintptr, bool) {
	if a|b < 1<<(4*sys.PtrSize) || a == 0 {
		return a * b, false
	}
	overflow := b > MaxUintptr/a
	return a * b, overflow
}

// Mul64返回x和y的128位乘积：（hi，lo）=x*y 
// 乘积位的上半部分在hi中返回，下半部分在lo中返回。
// 这是math/bits.Mul64 
// 在支持的平台上，这是一个由编译器降低的内部版本。
func Mul64(x, y uint64) (hi, lo uint64) {
	const mask32 = 1<<32 - 1
	x0 := x & mask32
	x1 := x >> 32
	y0 := y & mask32
	y1 := y >> 32
	w0 := x0 * y0
	t := x1*y0 + w0>>32
	w1 := t & mask32
	w2 := t >> 32
	w1 += x0 * y1
	hi = x1*y1 + w2 + w1>>32
	lo = x * y
	return
}
